/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Adaptadores;

import SensorDataDesktop.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;

/**
 *
 * @author Luis
 */
public class AdaptadorServerUDPT extends Thread implements AdaptadorServer {

    public DatagramSocket aSocket = null;
    String tramaRecibida = "";
    public int port;
    IUServer inter;
    int contador = 0;

    public AdaptadorServerUDPT(int p, IUServer i) {
        inter = i;
        port = p;
    }

    @Override
    /**
     * Escucha y envia a persistir las tramas recibidas por el puerto ingresado desde la intefaz de usuario.
     */
    public void run() {
        try {
            // Crea un socket para datagramas y le asocia al puerto p.
            aSocket = new DatagramSocket(port);
            while (true) {
                // Creamo un buffer para entrada de datos.
                byte[] buffer = new byte[100000];
                // Genera un datagrama para mensages de longitud indicada.
                DatagramPacket request = new DatagramPacket(buffer, buffer.length);
                // Esperamos a recibir algun paquete de un cliente.
                aSocket.receive(request);
                contador++;
                tramaRecibida = new String(buffer).trim();
                Persistir persistir = new Persistir(tramaRecibida, "#");
                persistir.start(); //envia a persistir la trama recibida.
                System.out.println("Trama: " + tramaRecibida);
                System.out.println("Contador: " + contador + "     Fecha: " + new Date().toGMTString());
                mostarEnIU(); // muestra las tramas en la interfaz gráfica.
                buffer = null; // borro el buffer para la proxima trama.
            }// Fin while
        } catch (SocketException ex) {
            Logger.getLogger(AdaptadorServerUDPT.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AdaptadorServerUDPT.class.getName()).log(Level.SEVERE, null, ex);
        } //Excepciones
    }
    /**
     * Muestra las ultimas 5000 tramas recibidas en la interfaz de usuario.
     */
    private void mostarEnIU() {
        if (inter.getArea().getLineCount() < 5000) { // si hay menos de 1000 tramas en pantalla
            inter.getArea().append(tramaRecibida + "    " + new Date().toLocaleString() + "\n");
            inter.getArea().setCaretPosition(inter.getArea().getDocument().getLength());
        } else {
            try {
                inter.getArea().append(tramaRecibida + "    " + new Date().toLocaleString() + "\n");
                inter.getArea().setCaretPosition(inter.getArea().getDocument().getLength());
                Element borrar = inter.getArea().getDocument().getDefaultRootElement().getElement(0); // obtengo como elemento la primer fila de la pantalla
                inter.getArea().getDocument().remove(borrar.getStartOffset(), borrar.getEndOffset());
            } catch (BadLocationException ex) {
                Logger.getLogger(AdaptadorServerUDPT.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public IUServer getInter() {
        return inter;
    }

    public void setInter(IUServer inter) {
        this.inter = inter;
    }
}